#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Project    : AutomatedTesting
# @Name       : conftest.py
# @IDE        : PyCharm
# @Author     : OneYoung
# @Created    : 2025/8/24 21:15
# @Desc       : 前置、后置操作

import allure
import pytest
import redis
import pymysql
from utils.log_record import logger
from application.settings import *
from utils.database import DataBase


# 钩子函数
def pytest_configure(config):
    """根据配置修改运行参数"""
    # 是否生成Allure报告
    if ALLURE_ENABLE:
        config.option.allure_report_dir = ALLURE_REPORT_DIR
        config.option.clean_alluredir = ALLURE_DIR_CLEAN
    # 添加用例失败重试命令
    if RERUNS > 0:
        config.option.reruns = RERUNS
        config.option.reruns_delay = RERUNS_DELAY


# 钩子函数
def pytest_runtest_setup(item):
    """在每个测试开始前动态设置allure.epic"""
    # 如果有自定义则使用自定义epic
    epic_name = ALLURE_EPIC
    if 'epic' in item.keywords:
        epic = next(keyword for keyword in item.iter_markers(name='epic'))
        epic_name = epic.args[0] if epic.args else epic_name
    allure.dynamic.epic(epic_name)


# 数据库服务
@pytest.fixture(scope="session")
def db():
    if DB_ENABLE:
        logger.info("创建数据库连接...")
        # 创建数据库连接
        connect = pymysql.connect(**DB_CONFIG)
        # 数据库操作
        db_opt = DataBase(connect)
        yield db_opt
        # 关闭数据库连接
        connect.close()
        logger.info("关闭数据库连接...")
    else:
        logger.error("!!! 如需使用数据库服务,需在application.env中启用[ DB_ENABLE=True ]")


# Redis服务
@pytest.fixture(scope="session")
def rd():
    if REDIS_ENABLE:
        logger.info("创建Redis连接...")
        # 创建Redis连接
        server = redis.from_url(REDIS_DB_URL, decode_responses=True, health_check_interval=1)
        yield server
        # 关闭Redis服务
        server.close()
        logger.info("关闭Redis连接...")
    else:
        logger.error("!!! 如需使用Redis服务,需在application.env中启用[ REDIS_ENABLE=True ]")
